
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2023-03-02
 * Time: 20:32
 */

//开闭原则
public class Ocp {
    public static void main(String[] args) {
        //使用 画图的类
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        //把相应的对象实列 传给了对象 drawShape 根据传过去的type类型不同 调用了不同的方法

        //新增
        graphicEditor.drawSjx(new Triangle());
    }
}

//方式一
//1.优点好理解 简单容易操作
//2.缺点 违反了设计模式ocp原则 即对扩展开放(创作者),对修改关闭(使用者),
//  就是当我们给类增加新的功能之后 尽量不修改或者少修改代码
//3. 如果我们要新增一个三角形 修改很多的地方 违背了开闭原则



//这是一个绘图的类 GraphicEditor 图形编辑器
//这个类就是使用方 要修改
class GraphicEditor{
    //drawShape 画形状的方法  接收Shape对象 根据type绘制不同的图像
    public void drawShape(Shape s){
        if (s.m_type == 1){
            drawRectangle(s);
        } else if (s.m_type == 2) {
            drawCircle(s);
        } else if (s.m_type == 3) {
            //新增了累心判断
            drawSjx(s);
        }
    }

    //画矩形
    public void drawRectangle(Shape r){
        System.out.println("绘制矩形");
    }

    //画圆形
    public void drawCircle(Shape r){
        System.out.println("绘制圆形");
    }

    //增加绘制三角形
    public void drawSjx(Shape r){
        System.out.println("绘制▲");
    }

}

// shape (谁普) 形状
class Shape{
    int m_type;
}

//矩形类 继承 Shape
class Rectangle extends Shape{
    Rectangle(){
        super.m_type = 1;
    }
}

//圆形类 继承 Shape 在构建的时候赋不同的类型
class Circle extends Shape{
    Circle(){
        super.m_type = 2;
    }
}

//新增三角形
class Triangle extends Shape{
    Triangle(){
        super.m_type = 3;
    }
}
